this全面解析
调用位置:函数在代码中被调用的位置(而不是声明的位置)
function baz(){ console.log('baz'); bar(); } function bar(){ console.log('bar'); foo(); } function foo(){ debugger; //断点调试 console.log('foo'); } baz();
绑定规则
-
默认绑定:独立函数调用
function foo(){ console.log(this.a); } var a =2 ; foo();
-
隐式绑定:调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含
function foo(){ console.log(thia.a); } var obj = { a:2, foo:foo } obj.foo();
-
显示绑定
-
new 绑定
优先级
1. 存在 new 绑定的话,this绑定的是新创建的对象 var bar = new foo(); 2. call apply(显示绑定)或者硬绑定调用,this绑定的是指定的对象 var bar = foo.call(obj2); 3. 存在某个上下文对象中调用(隐式绑定),this绑定的是那个上下文对象 var bar = obj1.foo(); 4. 默认绑定 var bar = foo();
绑定例外
this 词法
箭头函数会继承外层函数调用的this 绑定(self = this) function foo(){ return (a) => { console.log(this.a); } } var obj1 = { a:1 } var obj2 = { a:2 } var bar = foo.call(obj1); bar.call(obj2);